﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using FimetContoDeposito.BLL.Facades;
using FimetContoDeposito.BLL.ResultSets;
using FimetContoDeposito.DAL;
using GrayParrot.Core;
using GrayParrot.Web.Controls;
using GrayParrot.Web.Formly;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace FimetContoDeposito.Controllers
{
    public class AnagraficaCodiciFornitoriController : ApiController
    {
        #region Loading Fields...
        [HttpGet]
        public string LoadFornitoriFields()
        {
            string retValue = null;

            var m_fields = new FormlyFactory()
                   .AddSelect("Fornitori", "Fornitori", "", "indica il fornitore", false, true, null, "/api/Common/LoadFornitori")
                   .Create();

            retValue = FormlyHelper.Serialize(m_fields);

            return retValue;
        }

        [HttpGet]
        public string LoadFieldsEx(Guid idFornitore)
        {
            string retValue = null;

            var m_fields = new FormlyFactory()
                   .AddInput("Codice", "Codice", "", "inserisci il codice", false, true, 0, 0)
                   .AddSelect("Cliente", "Magazzino", "", "inserisci il magazzino", false, false, null, "/api/Common/LoadCustomersByFornitore", null, null, "IdFornitore", true)
                   .AddInput("IdFornitore", "IdFornitore", "", "", false, false, 0, 0)
                   //.AddInput("descrizione", "Descrizione", "", "inserisci la descrizione", false, true, 0, 0)
                   .Create();

            m_fields.DefaultValue<Guid>("IdFornitore", idFornitore);
            m_fields.Hide("IdFornitore");

            retValue = FormlyHelper.Serialize(m_fields);

            return retValue;
        }

        [HttpGet]
        public string[] LoadFieldsEx(Guid id, Guid idFornitore)
        {
            string[] retValue = new string[2] { string.Empty, string.Empty };

            FCD_CodiciFornitori obj = null;
            using (CodiciFornitoriFacade m_dc = CodiciFornitoriFacade.Create())
            {
                ReturnValue<FCD_CodiciFornitori> m_objs = m_dc.Get(id, "FCD_Customer");
                if (m_objs.HasValue)
                {
                    obj = m_objs.Value;
                }
            }

            if (obj != null)
            {
                var m_fields = new FormlyFactory()
                                   .AddInput("Codice", "Codice", "", "inserisci il codice", false, false, 0, 0)
                                   .AddSelect("Cliente", "Magazzino", "", "inserisci il cliente", false, false, null, "/api/Common/LoadCustomersByFornitore", null, null, "IdFornitore", true)
                                   .AddInput("IdFornitore", "IdFornitore", "", "", false, false, 0, 0)
                                   //.AddInput("descrizione", "Descrizione", "", "inserisci la descrizione", false, true, 0, 0)
                                   .Create();

                if (obj.IdCustomer.HasValue)
                {
                    m_fields.DefaultValue<Guid>("Cliente", obj.IdCustomer.Value);
                }
                
                m_fields.DefaultValue<Guid>("IdFornitore", idFornitore);
                m_fields.Hide("IdFornitore");

                retValue[0] = FormlyHelper.Serialize(m_fields);

                retValue[1] = JsonConvert.SerializeObject(obj);
            }
            else
            {
            }

            //
            return retValue;
        }

        [HttpGet]
        public string[] LoadFields___(Guid id)
        {
            string[] retValue = new string[2] { string.Empty, string.Empty };

            FCD_CodiciFornitori obj = null;
            using (CodiciFornitoriFacade m_dc = CodiciFornitoriFacade.Create())
            {
                ReturnValue<FCD_CodiciFornitori> m_objs = m_dc.Get(id);
                if (m_objs.HasValue)
                {
                    obj = m_objs.Value;
                }
            }

            if (obj != null)
            {
                var m_fields = new FormlyFactory()
                                   .AddInput("codice", "Codice", "", "inserisci il codice", false, false, 0, 0)
                                   .AddInput("Descrizione", "Descrizione", "", "inserisci la descrizione", false, true, 0, 0)
                                   .Create();

                retValue[0] = FormlyHelper.Serialize(m_fields);

                retValue[1] = JsonConvert.SerializeObject(obj);
            }
            else
            {
            }

            //
            return retValue;
        }
        #endregion

        [HttpPost]
        public System.Net.Http.HttpResponseMessage Add(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;

            Guid m_idCustomer = Guid.Empty;
            string m_idC = json.Cliente.ToString();
            if (!string.IsNullOrWhiteSpace(m_idC))
            {
                m_idCustomer = Guid.Parse(m_idC);
            }

            using (CodiciFornitoriFacade m_cff = CodiciFornitoriFacade.Create())
            {
                FCD_CodiciFornitori obj = new FCD_CodiciFornitori();
                obj.Id = Guid.NewGuid();
                obj.Codice = json.Codice;
                if (m_idCustomer != Guid.Empty)
                {
                    obj.IdCustomer = m_idCustomer;
                }
                obj.IdFornitore = Guid.Parse(json.IdFornitore.ToString());

                ReturnValue<bool> m_res = m_cff.Add(obj);

                if (m_res.HasValue && m_res.Value)
                {
                    retValue = Request.CreateResponse(HttpStatusCode.OK, "Codice aggiunto");
                }
                else
                {
                    if (m_res.HasError)
                    {
                        retValue = Request.CreateResponse(HttpStatusCode.OK, m_res.Error.Message);
                    }
                }
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage Delete(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;
            Guid m_id = Guid.Parse(json.id.ToString());

            using (CodiciFornitoriFacade m_dc = CodiciFornitoriFacade.Create())
            {
                ReturnValue<bool> result = m_dc.Delete(m_id);

                if (result.HasValue)
                {
                    if (result.HasValue)
                    {
                        retValue = Request.CreateResponse(HttpStatusCode.OK, "Cancellazione Codice Fornitore effettuata !");
                    }
                    else
                    {
                        retValue = Request.CreateResponse(HttpStatusCode.OK, "Errore nella cancellazione del Codice Fornitore. Verificare che il codice non sia utilizzato.");
                    }

                }
                else
                {
                    string msg = string.Format("Errore nella cancellazione del Codice Fornitore. " + result.Error.Message, "Codice fornitore");
                    retValue = Request.CreateResponse(HttpStatusCode.OK, msg);
                }
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage Edit(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;

            Guid m_idCodice = Guid.Parse(json.Id.ToString());
            Guid m_idCustomer = Guid.Empty;
            string m_idC = json.Cliente.ToString();
            if (!string.IsNullOrWhiteSpace(m_idC))
            {
                m_idCustomer = Guid.Parse(m_idC);
            }

            using (CodiciFornitoriFacade m_cff = CodiciFornitoriFacade.Create())
            {
                ReturnValue<FCD_CodiciFornitori> m_obj = m_cff.Get(m_idCodice, "FCD_Customer");
                if (m_obj.HasValue && m_obj.Value != null)
                {
                    m_obj.Value.Codice = json.Codice;
                    if (m_idCustomer != Guid.Empty)
                    {
                        m_obj.Value.IdCustomer = m_idCustomer;
                    }
                    ReturnValue<bool> m_res = m_cff.Edit(m_obj.Value);

                    if (m_res.HasValue && m_res.Value)
                    {
                        retValue = Request.CreateResponse(HttpStatusCode.OK, "Codice modificato");
                    }
                    else
                    {
                        if (m_res.HasError)
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.OK, m_res.Error.Message);
                        }
                    }
                }
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage LoadByFornitore(CodiciFornitoriDTParameters data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            string m_idC = data.Fornitore.SanitizeDropdownItem();
            Guid m_id = Guid.Parse(m_idC);

            using (CodiciFornitoriFacade m_dc = CodiciFornitoriFacade.Create())
            {
                ReturnValue<IQueryable<FCD_CodiciFornitori>> m_objs = m_dc.GetAllByFornitore(m_id);

                DTResult<FCD_CodiciFornitori> result = DTResult<FCD_CodiciFornitori>.Empty("Nessun elemento trovato");
                if (m_objs.HasValue)
                {
                    CodiciFornitoriResultSet m_rs = new CodiciFornitoriResultSet(data, m_objs.Value);
                    result = m_rs.GetResult();
                }
                else
                {
                    if (m_objs.HasError)
                    {
                        result.Message.MessageType = MessageTypes.Error;
                        result.Message.Message = m_objs.Error.Message;
                    }
                }

                retValue = Request.CreateResponse(HttpStatusCode.OK, result);
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage GetArticoli(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;

            Guid m_idCodice = Guid.Parse(json.Id.ToString());

            using (CodiciFornitoriFacade m_cff = CodiciFornitoriFacade.Create())
            {
                //m_cff.GetAllByCodiceFornitore(m_idCodice);
            }

            return retValue;
        }

        /// <summary>
        /// Ritorna un elenco di codici fornitore per un dato articolo, fornitore e magazzino
        /// </summary>
        /// <param name="data">The data.</param>
        /// <returns></returns>
        /// <remarks>
        /// Se all'articolo è assegnato un codice del fornitore indicato, il metodo ritorna quel codice
        /// Se all'articolo non è assegnato alcun codice del fornitore indicato, allora il metodo ritorna
        /// tutti i codici di quel fornitore che possono essere assegnati.
        /// Tipicamente tutti i codice di quel fornitore che non sono stati assegnati ad altri articoli di quel cliente...
        /// </remarks>
        [HttpPost]
        public List<NameValue<string, Guid>> LoadCodiciFornitoriArticoli(JObject data)
        {
            List<NameValue<string, Guid>> retValue = null;

            dynamic json = data;

            if (json.parameters[0] != null && json.parameters[1] != null)
            {
                Guid m_idArticolo = Guid.Parse(json.parameters[0].ToString());
                Guid m_idCustomer = Guid.Parse(json.parameters[1].ToString());
                Guid m_idFornitore = Guid.Parse(json.parameters[2].ToString());

                using (CodiciFornitoriFacade m_cf = CodiciFornitoriFacade.Create())
                {
                    ReturnValue<List<NameValue<string, Guid>>> m_res = m_cf.GetCodiceFornitoreArticolo(m_idArticolo, m_idFornitore, m_idCustomer);

                    if (m_res.HasValue && m_res.Value != null)
                    {
                        retValue = m_res.Value;
                    }
                    else
                    {
                        ReturnValue<List<NameValue<string, Guid>>> m_res1 = m_cf.GetCodiciFornitoreAssegnabili(m_idFornitore, m_idCustomer);

                        if (m_res1.HasValue && m_res1.Value != null)
                        {
                            retValue = m_res1.Value;
                        }
                    }
                }

                if (retValue != null)
                {
                    retValue.Insert(0, new NameValue<string, Guid>() { name = "Select...", value = Guid.Empty });
                }
            }

            return retValue;
        }

        [HttpPost]
        public List<NameValue<string, Guid>> LoadAllCodiciFornitoreByCliente(JObject data)
        {
            List<NameValue<string, Guid>> retValue = null;

            dynamic json = data;

            if (json != null)
            {
                if ((json.parameters[0] != null && json.parameters[0] != "") &&
                    (json.parameters[1] != null && json.parameters[1] != "" && json.parameters[1] != "  "))
                {
                    string p1 = json.parameters[0].ToString();
                    string p2 = json.parameters[1].ToString();

                    Guid m_idCustomer = Guid.Parse(p1.SanitizeDropdownItem());
                    Guid m_idFornitore = Guid.Parse(p2.SanitizeDropdownItem());

                    using (CodiciFornitoriFacade m_cf = CodiciFornitoriFacade.Create())
                    {
                        ReturnValue<List<NameValue<string, Guid>>> m_res = m_cf.GetCodiciFornitoriArticoli(m_idFornitore, m_idCustomer); 
                        // .GetCodiciFornitoreAssegnabili(m_idFornitore, m_idCustomer);

                        if (m_res.HasValue && m_res.Value != null)
                        {
                            retValue = m_res.Value;
                        }
                    }
                }
            }

            return retValue;
        }

        [HttpPost]
        public List<NameValue<string, Guid>> LoadCodiciFornitoriAssegnabili(JObject data)
        {
            List<NameValue<string, Guid>> retValue = null;

            dynamic json = data;

            if (json != null)
            {
                if ((json.parameters[0] != null && json.parameters[0] != "") && (json.parameters[1] != null && json.parameters[1] != ""))
                {
                    Guid m_idCustomer = Guid.Parse(json.parameters[0].ToString());
                    Guid m_idFornitore = Guid.Parse(json.parameters[1].ToString());

                    using (CodiciFornitoriFacade m_cf = CodiciFornitoriFacade.Create())
                    {
                        ReturnValue<List<NameValue<string, Guid>>> m_res = m_cf.GetCodiciFornitoreAssegnabili(m_idFornitore, m_idCustomer);

                        if (m_res.HasValue && m_res.Value != null)
                        {
                            retValue = m_res.Value;
                        }
                    }
                }
            }

            return retValue;
        }

        [HttpPost]
        public System.Net.Http.HttpResponseMessage GetCodiceFornitore(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;

            if (json != null)
            {
                Guid m_codice = Guid.Parse(json.codice.ToString());
                using (CodiciFornitoriFacade m_cf = CodiciFornitoriFacade.Create())
                {
                    ReturnValue<FCD_CodiciFornitori> m_res = m_cf.Get(m_codice);
                    if (m_res.HasValue && m_res.Value != null)
                    {
                        retValue = Request.CreateResponse(HttpStatusCode.OK, m_res.Value);
                    }
                    else
                    {
                        if (m_res.HasError)
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.OK, m_res.Error);
                        }
                        else
                        {
                            retValue = Request.CreateResponse(HttpStatusCode.OK, m_res.Value);
                        }
                    }
                }
            }

            return retValue;
        }

        /// <summary>
        /// Cambia l'associazione tra articolo e codice fornitore...
        /// </summary>
        /// <param name="data">The data.</param>
        /// <returns></returns>
        [HttpPost]
        public System.Net.Http.HttpResponseMessage EliminaAssociazioneCodice(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;

            if (json != null)
            {
                Guid m_idArticolo = Guid.Parse(json.articolo.ToString());
                Guid m_vecchioCodice = Guid.Parse(json.codice.ToString());

                using (CodiciFornitoriFacade m_cf = CodiciFornitoriFacade.Create())
                {
                    ReturnValue<bool> m_res = m_cf.RemoveAssociazioneArticolo(m_idArticolo, m_vecchioCodice);

                    ReturnMessage result = new ReturnMessage();
                    if (m_res.HasValue && m_res.Value)
                    {
                        result.Message = "Cambio codici effettuato.";
                        result.MessageType = MessageTypes.Success;
                    }
                    else
                    {
                        if (m_res.HasError)
                        {
                            result.Message = m_res.Error.Message;
                            result.MessageType = MessageTypes.Error;
                        }
                        else
                        {
                            result.Message = m_res.Message;
                            result.MessageType = MessageTypes.Warning;
                        }
                    }

                    retValue = Request.CreateResponse(HttpStatusCode.OK, result);
                }
            }

            return retValue;
        }

        /// <summary>
        /// Cambia l'associazione tra articolo e codice fornitore...
        /// </summary>
        /// <param name="data">The data.</param>
        /// <returns></returns>
        [HttpPost]
        public System.Net.Http.HttpResponseMessage CambiaCodice(JObject data)
        {
            System.Net.Http.HttpResponseMessage retValue = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            dynamic json = data;

            if (json != null)
            {
                Guid m_idArticolo = Guid.Parse(json.articolo.ToString());
                Guid m_vecchioCodice = Guid.Parse(json.vecchioCodice.ToString());
                Guid m_nuovoCodice = Guid.Parse(json.nuovoCodice.ToString());

                using (CodiciFornitoriFacade m_cf = CodiciFornitoriFacade.Create())
                {
                    ReturnValue<bool> m_res = m_cf.CambiaCodice(m_idArticolo, m_vecchioCodice, m_nuovoCodice);

                    ReturnMessage result = new ReturnMessage();
                    if (m_res.HasValue && m_res.Value)
                    {
                        result.Message = "Cambio codici effettuato.";
                        result.MessageType = MessageTypes.Success;
                    }
                    else
                    {
                        if (m_res.HasError)
                        {
                            result.Message = m_res.Error.Message;
                            result.MessageType = MessageTypes.Error;
                        }
                        else
                        {
                            result.Message = m_res.Message;
                            result.MessageType = MessageTypes.Warning;
                        }
                    }

                    retValue = Request.CreateResponse(HttpStatusCode.OK, result);
                }
            }

            return retValue;
        }

        /// <summary>
        /// Ritorna il codice assegnato all'articolo e gli altri eventuali codici liberi del fornitori per 
        /// mostrarli nella finestra di modifica...
        /// </summary>
        /// <param name="data">The data.</param>
        /// <returns></returns>
        [HttpPost]
        public List<NameValue<string, Guid>> LoadCodiciFornitoriAssegnabiliEAssegnato(JObject data)
        {
            List<NameValue<string, Guid>> retValue = null;

            dynamic json = data;

            if (json != null)
            {
                if ((json.parameters[0] != null && json.parameters[0] != "") && 
                    (json.parameters[1] != null && json.parameters[1] != "") &&
                    (json.parameters[2] != null && json.parameters[2] != ""))
                {
                    Guid m_idArticolo = Guid.Parse(json.parameters[0].ToString());
                    Guid m_idCustomer = Guid.Parse(json.parameters[1].ToString());
                    Guid m_idFornitore = Guid.Parse(json.parameters[2].ToString());

                    using (CodiciFornitoriFacade m_cf = CodiciFornitoriFacade.Create())
                    {
                        ReturnValue<List<NameValue<string, Guid>>> m_res = m_cf.GetCodiciFornitoreAssegnabiliEAssegnato(m_idArticolo, m_idFornitore, m_idCustomer);

                        if (m_res.HasValue && m_res.Value != null)
                        {
                            retValue = m_res.Value;
                        }
                    }
                }
            }

            return retValue;
        }

        /// <summary>
        /// Ritorna tutti i codici fornitore di un cliente, ordinati per fornitore...
        /// </summary>
        /// <param name="data">The data.</param>
        /// <returns></returns>
        [HttpPost]
        public List<GroupedNameValue<string, Guid>> LoadCodiciFornitoreCliente(JObject data)
        {
            List<GroupedNameValue<string, Guid>> retValue = null;

            dynamic json = data;

            if (json.parameters[0] != null && json.parameters[0] != "")
            {
                Guid m_idCustomer = Guid.Parse(json.parameters[0].ToString());

                using (CodiciFornitoriFacade m_cf = CodiciFornitoriFacade.Create())
                {
                    ReturnValue<List<GroupedNameValue<string, Guid>>> m_res = m_cf.GetCodiciFornitoriCliente(m_idCustomer);

                    if (m_res.HasValue && m_res.Value != null)
                    {
                        retValue = m_res.Value;
                    }
                }
            }

            return retValue;
        }
    }

    public class CodiciFornitoriDTParameters : DTParameters
    {
        public string Fornitore { get; set; }

        public CodiciFornitoriDTParameters()
        {

        }
    }
}